'use strict';
const db = uniCloud.database();
const dbCmd = db.command;
const collection = db.collection('leaderboard');
exports.main = async (event, context) => {
	const {
		userId,
		subject
	} = event;

	if (!subject || !userId || !isObject(subject)) {
		return {
			errCode: -1,
			errMsg: '缺少必要参数或类型不正确'
		};
	}
	try {
		const currentTime = Date.now();
		// 查找是否已有记录
		const {
			data: userList
		} = await collection.where({
			userId: userId
		}).get();
		let result;
		if (userList && userList.length > 0) {
			let userData = mergeAndCompare(userList[0], subject)
			userData.updateTime = currentTime

			// 更新现有记录
			result = await collection
				.doc(userList[0]._id)
				.update(userData);
		} else {
			// 创建新记录
			let userData = {
				createTime: currentTime,
				userId: userId,
				...subject
			}
			result = await collection.add(userData);
		}
		return {
			errCode: 0,
			errMsg: '更新成功',
			data: result
		};
	} catch {
		return {
			errCode: -1,
			errMsg: '服务器错误',
		};
	}
};

function isObject(value) {
	return value !== null && Object.prototype.toString.call(value) === '[object Object]'
}

function mergeAndCompare(objA, objB) {
	// 创建对象A的副本，避免修改原对象
	const result = {
		...objA
	};
	// 遍历对象B的所有属性
	for (const key in objB) {
		if (objB.hasOwnProperty(key)) {
			// 如果对象A也有这个属性
			if (objA.hasOwnProperty(key)) {
				// 比较属性值，如果B的值小于A的值，则替换
				if (objB[key] < objA[key]) {
					result[key] = objB[key];
				}
			} else {
				// 如果对象A没有这个属性，则添加到结果对象中
				result[key] = objB[key];
			}
		}
	}

	return result;
}